﻿using System;

namespace Hxsoft
{
	/// <summary>
	/// double 扩展类。
	/// </summary>
	public static partial class DoubleExtensions
	{
		/// <summary>
		/// 解析一个字符串为 double 值，如果解析失败则返回 null。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <returns>解析后的可空型的 double 值。</returns>
		public static double? ParseOrNull(string s)
		{
			double result;
			if (TryParse(s, out result))
				return result;
			return null;
		}



		/// <summary>
		/// 解析一个字符串为 double 值，如果解析失败则返回默认值。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <returns>解析后的 double 值。</returns>
		public static double ParseOrDefault(string s)
		{
			return ParseOrDefault(s, default(double));
		}

		/// <summary>
		/// 解析一个字符串为 double 值，如果解析失败则返回默认值。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <param name="defaultValue">解析失败时的默认值。</param>
		/// <returns>解析后的 double 值。</returns>
		public static double ParseOrDefault(string s, double defaultValue)
		{
			double result;
			if (TryParse(s, out result))
				return result;
			return defaultValue;
		}

		/// <summary>
		/// 解析一个字符串为 double 值，如果解析失败则返回默认值。
		/// </summary>
		/// <param name="s">进行解析的字符串。</param>
		/// <param name="defaultValue">解析失败时的默认值。</param>
		/// <returns>解析后的 double 值。</returns>
		public static double? ParseOrDefault(string s, double? defaultValue)
		{
			double result;
			if (TryParse(s, out result))
				return result;
			return defaultValue;
		}



		/// <summary>
		/// 将一个对象转换为 double 值，如果转换失败则返回默认值。
		/// </summary>
		/// <param name="from">进行转换的对象。</param>
		/// <returns>转换后的 double 值。</returns>
		public static double ConvertFromOrDefault(object from)
		{
			return ConvertFromOrDefault(from, default(double));
		}

		/// <summary>
		/// 将一个对象转换为 double 值，如果转换失败则返回默认值。
		/// </summary>
		/// <param name="from">进行转换的对象。</param>
		/// <param name="defaultValue">转换失败时的默认值。</param>
		/// <returns>转换后的 double 值。</returns>
		public static double ConvertFromOrDefault(object from, double defaultValue)
		{
			return from == null ? defaultValue : (double)from;
		}
	}
}
